<?php

namespace app\api\model;

use think\Db;
use think\Model;
use traits\model\SoftDelete;

class DbCommon extends Model
{

    use SoftDelete;

    

    // 表名
    //protected $name = 'spiderrobot_set';

    // 自动写入时间戳字段
   // protected $autoWriteTimestamp = false;

    // 定义时间戳字段名
   // protected $createTime = false;
    //protected $updateTime = false;
    //protected $deleteTime = false;


    // 自动写入时间戳字段
    protected $autoWriteTimestamp = 'int';


    function buildsql_procedure_param($in_columns=[],$in_params=[],$out_columns=[],$inout_columns=[])
    {
        $set = '';
        if ($in_columns && $in_params)
        {
            foreach ($in_columns as $v){
                if (is_numeric($in_params[$v])){
                    $set .= $in_params[$v].",";
                }else{
                    $set .= "'".$in_params[$v]."',";
                }
                //echo($v."<br>");
                //echo($in_params[$v]."<br>");
            }
        }
        if ($inout_columns){
            foreach ($inout_columns as $v2){
                $set .= "@_".$v2.",";
            }
        }
        if ($out_columns){
            foreach ($out_columns as $v2){
                $set .= "@_".$v2.",";
            }
        }
        
        //if (strlen($set) == 0){
        //    $set .= "@_res";
        //}
        $set = trim($set,',');
        //echo($set);
        return $set;
    }
    
    
    function buildsql_get_outparams($out_columns=[],$inout_columns=[])
    {
        $set = '';

        //先处理inout列
        if ($inout_columns){
            foreach ($inout_columns as $v2){
                $set .= "@_".$v2.",";
            }
        }
        //然后是输出参数列    
        if ($out_columns){
            foreach ($out_columns as $v1){
                $set .= "@_".$v1.",";
            }
        }
       
        //if (strlen($set) == 0){
        //    $set .= "@_res";
        //}  
        $set = trim($set,',');
        //my_debug(1,'set--67');
        //my_debug(1,$set);
        return $set;
    }
    
    
    protected function buildsql_set_inoutparam($in_out_columns=[],$in_params=[]){
       
        $inoutsql = '';
        if ($in_out_columns && $in_params){
           
            foreach ($in_out_columns as $v2){
                if (is_numeric($in_params[$v2])){
                    //val两边不加‘’    
                    $inoutsql .= "set @_" .$v2 ."=" .$in_params[$v2] ."; ";
                }else{
                    //val两边加上‘’
                    $inoutsql .= "set @_" .$v2 ."='" .$in_params[$v2] ."'; ";
                }
            }
        }
        //$set = trim($set,',');
        //my_debug(1,'set--80');
        //my_debug(1,$set);
        return $inoutsql;
    }

    
    
    //查询存储过程数据
    function mysql_procedure_execute($procedure_name='',$in_columns=[],$in_params=[],$out_columns=[],$in_out_columns=[])
    {
        $res = [];
        //最后res的数据格式：
        //res[out_column1] = val1
        //res[out_column2] = val2
        //res[in_out_column1] = val3
        //res[output] = 结果集[in_column1,in_column2...][]

        if ($procedure_name)
        {
            //若有输入输出参数，则需要提前声明mysql变量
            //譬如 set @_输入输出参数 = ‘val1’；set @_输入输出参数2 = ‘val2’；
            if (count($in_out_columns)){
                
                //形式：set @_输入输出参数 = ‘val1’；set @_输入输出参数2 = ‘val2’；
                $inoutsql = $this->buildsql_set_inoutparam($in_out_columns,$in_params);  
                Db::query($inoutsql);
            }

            //生成调用存储过程的sql语句
            // 譬如：call procedure('输入值1'，'输入值2'，@_输入输出参数1，@_输入输出参数2，@_输出参数2，@_输出参数3)
            $paramstr = $this->buildsql_procedure_param($in_columns,$in_params,$out_columns,$in_out_columns);
            $sql = "call {$procedure_name}($paramstr)";
    
            //echo($sql."<br>");
            
            //返回的结果集复制给‘output’字段
            $list = Db::query($sql);
            $res['output'] = [];
            if ($list){
                $res['output'] = $list[0]; //取第一个结果集
            }
            //print_r($res);    
            // echo("<br>");

            //取存储过程的输出参数值
            if (count($out_columns) or count($in_out_columns)){
    
                //需要通过select @_inoutColumn1,@_inoutColumn2,@_outColumn1,@_outColumn2,@_inoutColumn3
                //把存储过程的返回值取出来
                $sql_out = $this->buildsql_get_outparams($out_columns,$in_out_columns);
                $sql = "select {$sql_out}";
                
                //echo($sql."<br>");
                //my_debug(1,'$sql--60');
                //my_debug(1,$sql);
    
                $list = Db::query($sql);
                //list是个二维数组[@_列1、@_列2、@_列3、@_列4][]
                //把所有输出参数名前的"@_"头去掉，并把结果给$res
                //res[列1] = list[0][@_列1]
                
                //取第一行数据
                $cow1 = $list[0];
                if (is_array($cow1) && count($cow1) > 0)
                {
                    //依次取in_out_columns的参数值
                    foreach ($in_out_columns as $v){
                        //获取输出参数结果
                        $_key = '@_' . $v;
                        $res[$v] = $cow1[$_key];
                    }

                    //依次取out_columns参数值
                    foreach ($out_columns as $v){
                        //获取输出参数结果
                        $_key = '@_' . $v;
                        $res[$v] = $cow1[$_key];
                    }
                }
            }
        }
        return $res;
    }
    
    
}
